/*******************************************************************
 * Copyright (c) 2013 珠海比特讯科技有限公司. All rights reserved.
 * （1）软件的版权将受到法律保护，不允许非经授权的使用；
 * （2）未经版权所有人授权，任何人不得修改、复制和传播软件源代码、图片及其它资源等；
 * （3）未经版权所有人授权，不允许对软件进行修改；
 * （4）未经版权所有人授权，不允许在该软件的基础上开发新的软件；
 * （5）珠海比特讯科技有限公司拥有最终解释权
 *******************************************************************/
package youxiao.bytezon.configs.security.auth;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.io.IOException;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;

import youxiao.bytezon.configs.security.JSONResult;

public class BearerTokenAuthenticationService {
	static final long EXPIRATIONTIME = 5 * 24 * 3600; // 5天
	static final String SECRET = "P@ssw02d"; // JWT密码
	static final String TOKEN_PREFIX = "Bearer"; // Token前缀
	static final String HEADER_STRING = "Authorization";// 存放Token的Header Key

	public static void addAuthentication(HttpServletResponse response, String username) {
		// 生成JWT
		String compactJws = Jwts.builder()
				// 保存权限（角色）
		    .claim("authorities", "ROLE_ADMIN,AUTH_WRITE")
		    // 用户名写入标题
		    .setSubject(username)
		    // 有效期设置
		    .setExpiration(new Date(System.currentTimeMillis() + EXPIRATIONTIME))
		    // 签名设置
		    .signWith(SignatureAlgorithm.HS512, SECRET).compact();

		// 将 JWT 写入 body
		try {
			response.setContentType("application/json");
			response.setStatus(HttpServletResponse.SC_OK);
			response.getOutputStream().println(JSONResult.fillResultString(0, "", compactJws));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static Authentication getAuthentication(HttpServletRequest request) {
		// 从Header中拿到token
		String token = request.getHeader(HEADER_STRING);

		if (token != null) {
			// 解析 Token
			Claims claims = Jwts.parser()
					// 验签
			    .setSigningKey(SECRET)
			    // 解析jwt:
			    // 如果超时将抛出异常 io.jsonwebtoken.ExpiredJwtException（其它异常请参考io.jsonwebtoken.*Exception）
			    .parseClaimsJws(token.replace(TOKEN_PREFIX, "")).getBody();

			// 拿用户名
			String user = claims.getSubject();

			// 得到 权限（角色）
			List<GrantedAuthority> authorities = AuthorityUtils.commaSeparatedStringToAuthorityList((String) claims.get("authorities"));

			// 返回验证令牌
			return user != null ? new UsernamePasswordAuthenticationToken(user, null, authorities) : null;
		}
		
		return null;
	}
}
